【Tips】S3 アップロード時に ContentType を指定する
はじめに
本記事は、S3 利用時の Tips となります。 また、以下に示すソフトウェア環境で検証しております。
~ $ aws --version aws-cli/1.11.163 Python/2.7.10 Darwin/16.7.0 botocore/1.7.43 ~ $ sw_vers ProductName: Mac OS X ProductVersion: 10.12.6 BuildVersion: 16G1036 ~ $
問題
awscli で S3 に tgz(tar + gzip 圧縮)ファイルをアップロードし、ブラウザ(マネジメントコンソール)からダウンロードしようとすると gzip が展開され tar ファイルに変更されてしまう
$ aws s3 cp test.tgz s3://bucket-name upload: ./test.tgz to s3://bucket-name
原因
aws s3 cp コマンドによりアップロードされた tgz ファイルの ContentType が "application/x-tar" に設定されていたため
$ aws s3api head-object --bucket [Bucket Name] --key [Key Name] | grep ContentType "ContentType": "application/x-tar"
(aws s3 cp で ContentType を指定しない場合、Python のライブラリによりファイルの型を推定するようです)
- aws-cli/utils.py at 833716e1dae531fe8c3835c5feaa50d255c01be1 · aws/aws-cli
- 19.5. mimetypes — ファイル名を MIME 型へマップする — Python 3.6.3 ドキュメント
対処方法
S3 へのファイルアップロード時に適切な Content-Type を指定する。
$ aws s3 cp test.tgz s3://bucket-name --content-encoding "gzip" --content-type "application/x-gzip"
RFC 6713 の記載より 'application/gzip' を設定するのが良いか迷いましたがマネジメントコンソールからアップロードしたファイルの ContentType が "application/x-gzip" に設定されるようなので、こちらの設定に従いました。
さいごに
どこかで同じように困っている誰かの役に立てれば幸いです。ではでは